#pragma once
#include <iostream>
#include <vector>
#include <string>
#include <semaphore.h>
using std::cout;
using std::endl;

template <class T>
class RingQueue
{
private:
    P(sem_t &sem)
    {
        sem_wait(&sem);
    }
    V(sem_t &sem)
    {
        sem_post(&sem);
    }

public:
    RingQueue(int cap) : _cap(cap), _ring_queue(cap), _productor_step(0), _consumer_step(0)
    {
        sem_init(&_room_sem, 0, cap);
        sem_init(&_data_sem, 0, 0);
    }

    ~RingQueue()
    {
        sem_destroy(&_room_sem);
        sem_destroy(&_data_sem);
    }
    void Enqueue(const T& in)
    {
        P(_room_sem);
        _ring_queue[_product_step++] = in;
        _product_step %= _cap;
        V(_data_sem);
    }


private:
    // 1. 环形队列
    std::vector<T> _ring_queue; //
    int _cap;                   // 环形队列的容量上限
    // 2. 生产和消费的下标
    int _product_step;
    int _conusmer_step;
    // 3.定义信号量
    sem_t _room_sem; // 生产者关心
    sem_t _data_sem; // 消费者关心
};